﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using CRC.Clases;
using CRC.NHibernate;
using CRC.Inspecciones.Dominio.Clases;

namespace CRC.Inspecciones.Dominio.Controlador
{
    class ControladorListarHojasInspeccion
    {
        private static String strQryZonas = "select z.Id, z.Nombre from Zona z order by z.Nombre";
        private static String strQryTiposHojas = "select th.Id, th.Codigo from TipoHojaInspeccion th";
        private static String strQryAñosConHojas = "select distinct year(hp.Fecha) from HojaInspeccion hp order by year(hp.Fecha) desc";

        public IList<Object[]> ObtenerZonas()
        {
            ISession session = null;
            IList<Object[]> zonas = null;

            try
            {
                session = NHibernateHelper.GetCurrentSession();
                
                zonas = session.CreateQuery(strQryZonas).List<Object[]>();
                return zonas;
            }
            catch (HibernateException ex)
            {
                session.Close();
                throw ex;
            }
        }

        public IList<Object[]> ListarHojasInspeccion(int? pintAño, string strTipoHojaInspeccion, int? intZona) 
        {
            ISession session = null;
            ITransaction tx = null;
            IList<Object[]> lstInfoHojaInsp = null;
            string hql = string.Empty;
            Boolean añoNulo, tipoHojaNulo, zonaNula;
            
            try {
                
                session = NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();


                añoNulo = pintAño == null;
                tipoHojaNulo = string.IsNullOrEmpty(strTipoHojaInspeccion);
                zonaNula = intZona == null;

                hql = "select hp.Id, hp.Fecha, tipo_hoja.Codigo, salon.Zona.Nombre, salon.Nombre_Salon, hp.Datos, hp.EsBorrador " +
                    "from HojaInspeccion hp " +
                    "inner join hp.SalonInspeccionado as salon " +
                    "inner join hp.TipoImpreso as tipo_hoja";

                if (!añoNulo) { hql += " where YEAR(hp.Fecha)=" + pintAño; }
                if (!tipoHojaNulo) { hql += (añoNulo? " where " : " and ") + " hp.TipoImpreso.Id='" + strTipoHojaInspeccion + "'"; }
                if (!zonaNula){ hql += ((añoNulo && tipoHojaNulo)? " where " : " and ") + " salon.Zona.Id=" + intZona; }

                hql += " order by hp.Fecha desc, salon.Zona.Nombre desc, salon.Nombre_Salon desc, tipo_hoja.Codigo desc";

                lstInfoHojaInsp = session.CreateQuery(hql).List<Object[]>();
                tx.Commit();

                return lstInfoHojaInsp;
            }
            catch (HibernateException he) {
                if (tx != null) { tx.Rollback(); }
                if (session != null) session.Close();
                throw he;
            }
        }

        public IList<Object[]> ListarHojasInspeccion_By_IdSalon(int? id_Salon) {
            ISession session = null;
            ITransaction tx = null;
            IList<Object[]> lstInfoHojaInsp = null;
            string hql = string.Empty;
            try
            {

                session = NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();
                            
                hql = "select hp.Id, hp.Fecha, tipo_hoja.Codigo, salon.Zona.Nombre, salon.Nombre_Salon, hp.Datos " +
                    "from HojaInspeccion hp " +
                    "inner join hp.SalonInspeccionado as salon " +
                    "inner join hp.TipoImpreso as tipo_hoja" +
                    " where hp.SalonInspeccionado.Id=" + id_Salon ;
                            
                lstInfoHojaInsp = session.CreateQuery(hql).List<Object[]>();
                tx.Commit();

                return lstInfoHojaInsp;
            }
            catch (HibernateException he)
            {
                if (tx != null) { tx.Rollback(); }
                if (session != null) session.Close();
                throw he;
            }

        }

        public IList<Object[]> ObtenerTipoHojasInspeccion()
        {
            ISession session = null;
            IList<Object[]> tipoHojasInsp = null;

            try
            {
                session = NHibernateHelper.GetCurrentSession();

                tipoHojasInsp = session.CreateQuery(strQryTiposHojas).List<Object[]>();
                return tipoHojasInsp;

            }
            catch (HibernateException ex)
            {
                if (session != null) session.Close();
                throw ex;
            }
        }

        public IList<int> ObternerAñosConHojasDeInspeccion()
        {
            ISession session = null;
            IList<int> años = null;

            try
            {
                session = NHibernateHelper.GetCurrentSession();

                años = session.CreateQuery(strQryAñosConHojas).List<int>();
                return años;
            }
            catch (HibernateException ex)
            {
                if (session != null) session.Close();
                throw ex;
            }
        }
    }
}
